// 用户相关的小仓库
import {defineStore} from 'pinia'
// 引入登入请求接口
import {reqLogin, reqUserInfo, reqLogout} from '@/api/user/index'
// 引入操作本地存储的工具方法
import {SET_TOKEN, GET_TOKEN, REMOVE_TOKEN} from '@/utils/token'

// 引入路由
import {constantRoute} from "@/router/routes"
import {addRoutes} from "@/router"
import setting from "@/setting"

// 创建用户小仓库
const useUserStore = defineStore('User', {
    // 小仓库存储数据的地方
    state: () => {
        return {
            token: GET_TOKEN(),  // 用户的唯一标识token
            menuRoutes: constantRoute,  // 仓库存储菜单路由
            user: {},
            role: {},    // 当前角色
            roles: [],  // 角色
            permissions: [],  // 权限
            menus: []
        }
    },
    // 异步、逻辑
    actions: {
        // 用户登录的方法
        async userLogin(data) {
            // 登录请求
            const result = await reqLogin(data)
            // 登录请求:成功200->token
            // 登录请求:失败201->登录失败错误的信息
            if (result.code == setting.SYSTEM_SUCCESS) {
                // pinia仓库存储一下token
                // 由于pinia|vuex存储数据其实利用js对象
                this.token = result.data
                // 本地存储持久化存储一份
                SET_TOKEN(result.data)
                // 能保证当前async函数返回一个成功的promise
                return 'ok'
            } else {
                // 使用未知类型的值 必须先进行类型检查或者类型断言
                // 类型检查:typeof先判断类型
                if (typeof result === 'object' && 'msg' in result) {
                    return Promise.reject(new Error(result.msg))
                }
            }
        },
        // 获取用户信息方法
        async userInfo() {
            // 获取用户信息进行存储仓库当中[用户头像、名字]
            const result = await reqUserInfo()
            // 如果获取用户信息成功，存储一下用户信息
            if (result.code == setting.SYSTEM_SUCCESS) {
                // 用户基本信息
                this.user = result.data.user
                this.role = result.data.role
                this.permissions = result.data.permissions
                this.roles = result.data.roles
                this.menus = result.data.menus
                // 生成动态路由
                addRoutes(this.menus)
                // 更新菜单路由，合并constantRoute和动态路由
                // 由于动态路由已经添加到router中，我们可以从router.getRoutes()获取所有路由
                this.menuRoutes = [
                    ...constantRoute.filter(route => !route.meta?.hidden), // 过滤掉隐藏的静态路由
                    ...this.menus // 添加动态路由
                ]
                return 'ok'
            } else {
                return Promise.reject(new Error(result.message))
            }
        },
        // 退出登录
        async userLogout() {
            // 退出登录请求
            const result = await reqLogout()
            if (result.code == setting.SYSTEM_SUCCESS) {
                this.token = ''
                this.user = {}
                this.role = {}
                this.roles = []
                this.permissions = []
                this.menus = []
                REMOVE_TOKEN()
                return 'ok'
            } else {
                return Promise.reject(new Error(result.message))
            }
        },
    },
    getters: {}
})

export default useUserStore

